This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

ICMA 09/04/2025


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGxvdChjYXJzKVxuYGBgIn0= -->

```r
plot(cars)
```

<!-- rnb-source-end -->
```r
plot(cars)

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIGV5Sm9aV2xuYUhRaU9qUXpNaTQyTXpJNUxDSjNhV1IwYUNJNk56QXdMQ0prY0draU9pMHhMQ0p6YVhwbFgySmxhR0YyYVc5eUlqb3dMQ0pqYjI1a2FYUnBiMjV6SWpwYlhYMD0gLS0+XG5cbjxpbWcgc3JjPVxcZGF0YTppbWFnZS9wbmc7YmFzZTY0XG4ifQ== -->

<img src=:image/png;base64




<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1wbG90LWJlZ2luIC0tPlxuXG48aW1nIHNyYz1cImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBcndBQUFHd0NBTUFBQUI4VGthWEFBQUFVVkJNVkVVQUFBQUFBRG9BQUdZQU9wQUFaclk2QUFBNkFEbzZBR1k2T2pvNmtOdG1BQUJtQURwbWtKQm10ditRT2dDUWtHYVF0cENRMi8rMlpnQzIvLy9ia0RyYi8vLy90bWIvMjVELy83Yi8vOXYvLy84c25RemxBQUFBQ1hCSVdYTUFBQTdEQUFBT3d3SEhiNmhrQUFBTm8wbEVRVlI0bk8zZFlVUGJPQlpHWVZPZ3U4MHV6SkttSWVULy85Q043WVRRRnB0STF0VzlyM3llRDdQc0RHTW42Um1oeU1IcWpvQ296dnNCQUxtSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0tJRjdLSUY3S0lGN0xTNG4xNzdnYmZmaG85SE9CMlNmSHV1aC9qRi92TEY0Q2ZsSGpmbnQrVDNkMy8rdnh3d0dJVzhSNDJUNWN2OXhNVEI2YlFXTXdrM2x0RzNvVERBWjh5aWZjMDV6MFB2Wk56WHVMRllqYnhuaVlPNDZSa1l0d2xYaFJnRkcvdHcyR05pQmV5ak9MZG5hWU13N1IzeDJvRGJwV3crRFYrZi9GdjdPM3VYazdUM29jajhlSjIzVEd4QzhPbHNyZm4wOXMxNHNXTnVnOS9UZmszU243ajhYcVJZbnYvNjQ5NDB5K09ZQzJDeFB0K2tXTDd3TWlMR3dXSjkzMnljTmhNZmE2TWVQR25HSFBlNnlXMnQyZml4YTFpckRaVVB4eldpSGdoaTNnaGkzZ2h5MmlkOTdxZXl4czJXTEVaZVNjWEdmSU9CM3pHYU5ydzl2eFE4bkRBSjZ6bXZQdnVhZmFmRXk4VzR3MGJaQkV2WkJFdlpCRXZaQkV2WkJFdlpCRXZaQkV2WkJFdlpCRXZaQkV2WkJFdlpCRXZaQkV2WkJFdlpCRXZaSm45SnNYc2I3QVJMd3F3MnBQaXEzM1lpQmVMc1JzUVpKbmU0dlRJUG13d3hNZ0xXVlp6WHZaaGd6bWoxUWIyWVlNOTFua2hpM2doaTRzVWtNVkZDc2hpcVF5eUtsK2tZQjgybE1QSUMxbGNwSUFzTGxKQUZ1dThrRVc4a0VXOGtFVzhrTVUrYkpERlBteVF4VDVza01VK2JBZ2o5Vk1EdkdGREZOMHhzUXZpUlJEZE1QS21oRUc4Q0dLWU15Uk5ISWdYUVhRZi9wcnliNVQ4UnBmRFFSOGpMMlF4NTRVdVZodWdpM1ZlckFieFFoYnhRaGJ4UWhieFFoYnhRaGJ4UWhieFFzRG5LOERFaS9nbXJyMFI3K3JvM2VWdzZ2Tm14THMyeVo4ZzhFZThHS1IvYXRaZjVYaTVyWDlVaXZIV25mTnlXLyt3Sk9PdHVkckF6YVVERTV6elRqRzYzUk43RDhlbHQ5b3doWkVYc3F6bXZOeldQME03WTJJZFJxc04zTlkvUTBPejBUcFk1dzFEY3gzQVUrVjQyWWR0R3ZHbU1vcDMyM1VQdzRXS3FYdEY4bWYwRitKTlpmU0c3VFRYM1hZUC9keVhOMnczWTg2YnlHNnBiSC8zY21TcExBbXpxVFIyRnluR3l4TmNwSUFaUnQ3VmFXZDhONTd6ZnJqV3R1QndLS2lobVRXckRTdlQwcG9HRnlsV2huZ3JuaGRsRVcvRjg2SXc1cnoxem92U1dHMm9kbDVnQ3ZGQ0Z2RkNGdkZDRnZGQ0Z2RWlESFlEZ3Fya0ZXamlSUkRwMS82SUYwRVFMeGJ3dmZaR3ZNam4vYWtINXJ6STVmOTVNMVlia01rLzNsVEVpN1BDOFZhWVFLZkhlL2pQeS9DL1U3OFhYUGk4cUtib25MZkdCRG8vM2gzeHRxYmdZRmxsRHBJYTcvWjZ0N0dKM3dzdWZGNUlDaG52ZGVTdGRGNUVrRHdtQjQyMzhua1JRTVlFTnVhY2Q3aDUzbTdtdnRGbHp3dC9XY05veU5XRzQvYisxK3ZqdzNIN01QUGQ3TVBXa3FncndCbHozczNUY2Q4OXpTNlZzUTliVTlxS2Qzc0tkMmFwak4yQUd1UDlxWWNKT2RPR2g4UG0vdGRoTXoxdFlCKzIxc1M4MTBQV0c3YnU3dVh0ZVdiS3k4aUxHbXlXeXRpSExVdk04UzB1bzNWZTltSExFSFJtR1JjWEtjS0krcDQrcnNSNEQ1c2ZsMEYxZWcxMzdpanN3emFKZUZNWmpiejlXdHJyWTlmZFRYME9naitqdnhCdktwdDRoM2Evdi95MmFMYmdjQ3ZCbkRkUjhyVGgrb04vZXRvd2JCMDRYajVtcVN3QnM2azBHU1B2dVB5MW41d1JqT1B0ZWEyWGl4UXdreDd2NWZMRTFKamE2MGZkSFNOdlREbmplOHlmQ1htZmJlak5mVERuc1BuMjg4Tk9na3ZPaThKeVp0WkJaK001SSs5NDBXdzcrNEhlL1Rndm5yeUdIUENsV0llY05ZMm82eUJaYzk1KzZOM056SGxMbmhkbHJUemVjY2xoMlM5U0JId2xRaXMzNS9TUHQvUnpLZm1OTG9kclhNazVwL2VjdCtDeGlGZUEvOGpuTy9MUEg2dmtON29jcm0xUjU1dzVpSGRsL09ObDVEVThYT084MTFtWjgxb2VyblZxOXl5ZlBScXJEYWpIZjlyeU9lSnRsZG90SHpNUWI2T0tUcE85NTl3VGlMZE5oUWZMVmo1VlZ2bTh5QkwxSjMxUnhOc21SdDZzYjNRNUhQN0VuRGZuRzEwT2g3K3cycER4alM2SGd5WGlOVDJja3Bqeng5N1VJeU5lMDhNSkNUcC9QTTQ5c3FDUG1YZ3JpenFLelQreW1EOHRpTGN5elhoakl0N0s0aVlTOTVGTklkN2FnczRmajVFZjJRVGlyUzdtL0xFWDk1Rjl6aWhlOW1HRFBadDQyWWN0TUxYeGRacEp2T3dHRkpqY3pIYWFTYnpzd3hhWDNwckNORWJlbFNIZXI3QVBXeTNURTlpSmYwSzhYMklmdGpveVBvN0FuTGZlZVRGamVoaWRHV0JaYmNnOUhmdXdsWlFWYnp0TTQzMTluTmpJcXZtWHRSTGlMZnlOeDVzMnZHcjhaYTFGN2lPNFJkbU12T2RGQmtaZWM4bXJEUzB4VzIzbzF4bUlGNWJNNXJ6YnV4ZmlUZVE5V0hxZlA1WGRHN1pkOTRONGszaFBVNzNQbjh4d3RhSGY5WjE0YitlOVFPQjkvblNXUzJWdno4U2J3RHNlNy9PbjR3cmJMWXBPQnFQZUhjSDcvT21JOXdaRko0TnhsMmE5ejUrTWVMOVdkRWlhTzVqM3UzM3Y4NmNpM3E5Vml4ZHBpUGRya2VPdGRJVXQ1cGhNdkRlb05PY3RlckM0ajdrYzRyMUYxRkdzMHFmS29rNTFpRmNaOFJiK1JwZkRyUlR4RnY1R2w4T3RGWFBlc3Qvb2NyalZZcldoNkRlNkhBNXJSTHpMclBvM0did1I3eUp4UDZpd0JzUzdSS1YzKy9nYzhTNUJ2SzZJOXhicEg4R2RpVGRubXN3RStqUEVlNE9jbWUza1B5bDZzSFVqM3EvTlRRRUszcVdST1VncTR2MWFwVXV0eEp1S2VMK1cxdzRqcnpuaXZVSE9sSk01cnozaXZVWDZtMzFXR3lvd2luZjErN0R4azc0Q20zZ2o3TVBtTzFnUmJ3VW04VWJZRGNoN211aDkvalV3aVRmQVBteitJeC9UVkhPdGpyeis4Y0tjMVp6WGV4ODIvM2hYOEpzTTNveFdHL3ozWWZPZWN4WTl2L2VUQ2FyZGRkNkdWaHY4ZjR6RVZEbmUxZXpEUnJ3VkdNVzc2ODUzUmQ4MXNaVlYwU3RzR2FjdmViQ0dHTDFodTNzNVRYc2ZqbzNFVy9TekRiVWV3QW9ZTHBXOVBaL2VyclVRNzl6QXQrcjdKbmd6dlVpeHZmL1ZlTHdNaVo1c0wxSnNId0xHbXp5SzhVSGJvSXptdk9ka0Q1dDRldzluREphem44MGxYamRtcXczanhPSHRPVnE4V2IxRjNjQm41ZHE5U0RGNzRsS25aODdyaVhnWEhvNWZmdkN6dW5ockRaYU15ZmJXRjIrZElaSFpjQVVyakxjSzRxMkFlRzBRYndYRWE0UTVyejNpdGNKcWd6bmloYXhROFhvUFZ0N25SNXBJOFhwUEU3M1BqMFNCNHZWK2crNTlmcVFpM2pEblJ5cmlEWE4rcEFvVXIvdWMwL3Y4U0JRcFh2ZDMrOTduUjVwUThRSXBpQmV5aUJleWlCZXlpQmV5Mm8yWHBZUG1OUnN2aTdidGF6VmVMcGV0QVBGQ1ZxaDRDMDVUaVhjRklzVmJkSnJLbkxkOWdlSXRQRml5MnRDOGR1TkY4NHppemRrNG0zaVJ4aWJldkkyem1hWWlpVW04dWR1M01rMUZDcE40cHpmT1hzMCtiS2dnMU1nTHBMQ2E4M3B2bkkwVk1GcHQ4Tjg0RyswTHRNNExwQ0ZleUhLTEYxak1LZDVFM2dPMTkvbmRINEQyK1lsMzFROUErL3pFdStvSG9IMSs0bDMxQTlBK1AvR3UrZ0ZvbjU5NFYvMEF0TTlQdkt0K0FOcm5KOTVWUHdEdDh4UHZxaCtBOXZtOUh6MlFqWGdoaTNnaGkzZ2hpM2doaTNnaGkzZ2hpM2doaTNnaGkzZ2hpM2doaTNnaGkzZ2h5eS9lOGU0N0QxNm5mLzNYY0t2QWZkZmR2VGcrQUtkWFlialI4bkRMTHA4WDRQMzhpNTYvWDd5djMzMmlHUjAydzMwdTk2Yy91TDFMdmVjSDRQTXF2RDJmbnZPdWI4Ym5CYmllZjlIejk0dDNQM2w3OVJvbkgrL3VQdDczY3Vzdy9KOGZnTk9yOFByWTN6Rng5KzJuMHd2d2Z2NWx6OTh2M3AzYmpHRzR5K1h3cWwxZlJLY0g0UHNxM0wyNHZRRG44eTk3L243eGJ2OTltWGE1R09NZGZtajVqSDdqV1QxZmhlMjNuNTR2UUgvK1pjL2ZMZDdEcHI5UDZ0YXQzdUVQYkp6dCtVeDZod2ZnK1NyME4xbDJmUUZPNTEvMi9KMlh5dndtdmpIaS9ldkxpdWUvdkY5emVnSDIxeldHM09mdkhPODQ1L0lRWk5vdzhIZ1Z4cHZiKzcwQUgyK3VuL3Y4dmVOMVd5L3pmY04yL0QzZStxL0NlVmN5dHhkZzkzR2ltL3Y4M2VJZFh6Ym5hWVBmVXRsdi8vWFVmeFV1dTR0NHZRQ1g4eTk3L282ckRmMHI1dnlHemZFaXhXVzF3ZVZWZUgyOG5OSG5CYmllZjlIemQ1dzJiTHV1ODVyeHZ2L1h2bk83UEh4K0FDNnZ3bTY4QTNuL3pGMWVnQS9uWC9MOCtXQU9aQkV2WkJFdlpCRXZaQkV2WkJFdlpCRXZaQkV2WkJFdlpCRXZaQkV2WkJFdlpCRXZaQkV2WkJFdlpCRXZaQkV2WkJFdlpCRXZaQkV2WkJFdlpCRXZaQkV2WkJFdlpCRXZaQkV2WkJFdlpCRnZBRTYzK3BOSHZBRVFieDdpRFlCNDh4Q3ZvZGZINGY2ZHI5Ly85M2plOG1iWGZmTEYzVC9FbTRWNDdReTMvZDUzVDZlR24vci9QWlY2cW5TNHNmTDdGLzEyVG51dld3U3JJMTQ3bDd2VmovY0IzOTMvT214K2pILzcvWXZ4dHZaYjRzMUN2SGJPMnd0Zk5sNjRleG5udHFmL2UvM2lmWE1CcENOZVE4UGU1aytYL2FKTzhZNTNzKytlM3IvWUVlOEN4R3ZzTkNXNHhudUo5UG9GOFM1QXZNWU9tNmR4enJ2dDU3eFA3Mzl6L09LOER4cnhaaUZlTzhPQU9teXQzdThYZFZsdEdONmUvZllGcXcyWmlOZlFmdHl1NmZYeHY0L24vWnI2NWQxaHB2RHhDOVo1TXhHdlBiOE5saHRIdlBhSTF3angyaU5lSThRTFdjUUxXY1FMV2NRTFdjUUxXY1FMV2NRTFdjUUxXY1FMV2NRTFdjUUxXY1FMV2NRTFdjUUxXY1FMV2NRTFdjUUxXY1FMV2NRTFdjUUxXY1FMV2Y4SEhPcWNBeGN5c2xZQUFBQUFTVVZPUks1Q1lJST1cIiAvPlxuXG48IS0tIHJuYi1wbG90LWVuZCAtLT5cbiJ9 -->


<!-- rnb-plot-begin -->

<img src="data:image/png;base64,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" />

<!-- rnb-plot-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHViR2xpY21GeWVTaDBhV1I1ZG1WeWMyVXBYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbmxpYnJhcnkodGlkeXZlcnNlKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubGlicmFyeSh0aWR5dmVyc2UpXG5gYGAifQ== -->

```r
library(tidyverse)
Warning: package ‘tidyverse’ was built under R version 4.3.3Warning: package ‘tibble’ was built under R version 4.3.3Warning: package ‘tidyr’ was built under R version 4.3.3Warning: package ‘readr’ was built under R version 4.3.3Warning: package ‘purrr’ was built under R version 4.3.3Warning: package ‘dplyr’ was built under R version 4.3.3Warning: package ‘stringr’ was built under R version 4.3.3Warning: package ‘forcats’ was built under R version 4.3.3Warning: package ‘lubridate’ was built under R version 4.3.3── Attaching core tidyverse packages ─────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   4.0.0     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.4     ── Conflicts ───────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(dplyr)
library(palmerpenguins)
Warning: package ‘palmerpenguins’ was built under R version 4.3.3
library(nycflights13)
Warning: package ‘nycflights13’ was built under R version 4.3.3
library(ggplot2)

<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJkcGkiOi0xLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbWzEsIlx1MDAxYkcyO1x1MDAxYkgyO1dhcm5pbmdcdTAwMWJoOiBcdTAwMWJbMzg7NTsyNTNtUmVtb3ZlZCAyIHJvd3MgY29udGFpbmluZyBtaXNzaW5nIHZhbHVlcyBvciB2YWx1ZXMgb3V0c2lkZSB0aGUgc2NhbGUgcmFuZ2VcbihgZ2VvbV9wb2ludCgpYCkuXHUwMDFiWzM5bVx1MDAxYmdcbiJdXX0= -->

<img src=\data:image/png;base64

view(penguins)

<!-- rnb-frame-begin eyJtZXRhZGF0YSI6eyJjbGFzc2VzIjpbImRhdGEuZnJhbWUiXSwibnJvdyI6MzAsIm5jb2wiOjIsInN1bW1hcnkiOnsiRGVzY3JpcHRpb24iOlsiZGYgWzMwIMOXIDJdIl19fSwicmRmIjoiSDRzSUFBQUFBQUFBQm8xU1BVL0NRQmcrK29HaFVaUitBQzUxMVlFbWlvTUx5UTFHWENXYU1MRFVVa3BqYldzNXdPamk0c3lzcTg3TXpQZ2puSjJkWGRHNzZ4M1J4b0ZMM3ZEY3cvTzg5MzYwZGR5dUsyMEZBQ0FDU2M0QlVjWVF5QmZuSjdVakFDUUJYM0pBQWdYeWU0dEZHZ2FFTE9JdzRkWlV2L3RvVG1INTdQUFJuTFdnUHFNQVZ1T1hkNlZ4QTFWQUQxVFpYV2Q2MVNUQ0hXaHczNlN6K3pXZlFLMUJoY3U4SlhLTFgrRTZ5MXNockg0UGk0eXZzandhODVlYXhIZ0sxVGtoM3VBMnk2Y3pYNW1vT251d3pPb3lHRzh3WG1QdlZwL0llWWFWT2ozUVVHZ2kzUDhHNlpzT1piVVFWZ3h4dGZpemtIemdqdHhnZ05GV3VqL0tTZzVLQW81Umd2Wi80WU5NQnRrSjdBRlBzRXpic3gwVUpSZ3RzdkxRdm5hNVhPRHlzZXQ3ZmNRbFhoSU40NHl2a0VSamkzdkpCSVdIZEFGbUtoUy9NeVVvWFJ2WlZpL0Jsbi9LV0l0aTVFY2hUaWFRenpHZk1lZVNETEU1RE1uajNaclRINFpYdGNQTTMySWNldVJOdGpIQWFzeXhUWE1zcEZWSXZOWTg3OThOUFQ5MGVmK0JmZW55OFl0ZGQ4UmdFWStBVHNDS0V6L2swMUl3TzdCUWhHeHVVWndvNEF6dEhDeCtBSG5rN1MrakF3QUEifQ== -->

<div data-pagedtable=\false\>
  <script data-pagedtable-source type=\application/json\>
{\columns\:[{\label\:[\weight\],\name\:[1],\type\:[\dbl\],\align\:[\right\]},{\label\:[\group\],\name\:[2],\type\:[\fctr\],\align\:[\left\]}],\data\:[{\1\:\4.17\,\2\:\ctrl\},{\1\:\5.58\,\2\:\ctrl\},{\1\:\5.18\,\2\:\ctrl\},{\1\:\6.11\,\2\:\ctrl\},{\1\:\4.50\,\2\:\ctrl\},{\1\:\4.61\,\2\:\ctrl\},{\1\:\5.17\,\2\:\ctrl\},{\1\:\4.53\,\2\:\ctrl\},{\1\:\5.33\,\2\:\ctrl\},{\1\:\5.14\,\2\:\ctrl\},{\1\:\4.81\,\2\:\trt1\},{\1\:\4.17\,\2\:\trt1\},{\1\:\4.41\,\2\:\trt1\},{\1\:\3.59\,\2\:\trt1\},{\1\:\5.87\,\2\:\trt1\},{\1\:\3.83\,\2\:\trt1\},{\1\:\6.03\,\2\:\trt1\},{\1\:\4.89\,\2\:\trt1\},{\1\:\4.32\,\2\:\trt1\},{\1\:\4.69\,\2\:\trt1\},{\1\:\6.31\,\2\:\trt2\},{\1\:\5.12\,\2\:\trt2\},{\1\:\5.54\,\2\:\trt2\},{\1\:\5.50\,\2\:\trt2\},{\1\:\5.37\,\2\:\trt2\},{\1\:\5.29\,\2\:\trt2\},{\1\:\4.92\,\2\:\trt2\},{\1\:\6.15\,\2\:\trt2\},{\1\:\5.80\,\2\:\trt2\},{\1\:\5.26\,\2\:\trt2\}],\options\:{\columns\:{\min\:{},\max\:[10],\total\:[2]},\rows\:{\min\:[10],\max\:[10],\total\:[30]},\pages\:{}}}
  </script>
</div>

<!-- rnb-frame-end -->

<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJkcGkiOi0xLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= -->

<img src=\data:image/png;base64

glimpse(flights)
Rows: 336,776
Columns: 19
$ year           <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, …
$ month          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ day            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ dep_time       <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, 558, 558, 558, 558, 558, 559, 559, 559, 600, 600, 6…
$ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, 600, 600, 600, 600, 600, 600, 559, 600, 600, 600, 6…
$ dep_delay      <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, -2, -2, -1, 0, -1, 0, 0, 1, -8, -3, -4, -4, 0, 8, 1…
$ arr_time       <int> 830, 850, 923, 1004, 812, 740, 913, 709, 838, 753, 849, 853, 924, 923, 941, 702, 854, 851, 837, …
$ sched_arr_time <int> 819, 830, 850, 1022, 837, 728, 854, 723, 846, 745, 851, 856, 917, 937, 910, 706, 902, 858, 825, …
$ arr_delay      <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2, -3, 7, -14, 31, -4, -8, -7, 12, -6, -8, 16, -12, -…
$ carrier        <chr> "UA", "UA", "AA", "B6", "DL", "UA", "B6", "EV", "B6", "AA", "B6", "B6", "UA", "UA", "AA", "B6", …
$ flight         <int> 1545, 1714, 1141, 725, 461, 1696, 507, 5708, 79, 301, 49, 71, 194, 1124, 707, 1806, 1187, 371, 4…
$ tailnum        <chr> "N14228", "N24211", "N619AA", "N804JB", "N668DN", "N39463", "N516JB", "N829AS", "N593JB", "N3ALA…
$ origin         <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EWR", "LGA", "JFK", "LGA", "JFK", "JFK", "JFK", "EWR"…
$ dest           <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FLL", "IAD", "MCO", "ORD", "PBI", "TPA", "LAX", "SFO"…
$ air_time       <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 138, 149, 158, 345, 361, 257, 44, 337, 152, 134, 147…
$ distance       <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, 944, 733, 1028, 1005, 2475, 2565, 1389, 187, 2227, …
$ hour           <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, …
$ minute         <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 10, 5, 10, 10, 7, 0, 0, 10, 15…
$ time_hour      <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013-01-01 …
flights |>
  filter(month == 1 & day == 1)

flights_houston <- flights |>
  filter(dest %in% c("IAH", "HOU"))
```{r}
Error: attempt to use zero-length variable name

flights |>
  mutate(speed = distance / air_time * 60,
         .after = distance) |>
  head()
flights |>
  rename(dep_airport = origin,
         arr_airport = dest)
  select(year, month, day, contains("dep"))
  head()
  
flights |>
  select(!year:day)
  head()
flights |>
  group_by(month) |>
  count()

flights |>
  group_by(month) |>
  summarize(avg_delay = mean(dep_delay))
flights |>
  group_by(month) |>
  summarize(avg_arr_delay = mean(arr_delay, na.rm = TRUE),
          sd_arr_delay = sd(arr_delay, na.rm = TRUE),
          number_delayed = sum(arr_delay > 0, na.rm = TRUE),
          total = n(),
          percentage = number_delayed/total * 100
  ) |>
  ggplot(mapping = aes(x = month,
                       y = percentage))

ICMA 9/23/2025

  • Variables can’t start with a number or include spaces or symbols
  • Style we’ll use is snake_case
`1number` <- 12
print(`1number`)
[1] 12
library(nycflights13)
summary <- flights |>
  group_by(tailnum) |>
    summarize(avg_arr_delay = mean(arr_delay, na.rm=TRUE), num_flights = n())
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
Error in assign(cacheKey, frame, .rs.CachedDataEnv) : 
  attempt to use zero-length variable name
summary
#| label: style-example
#| echo: TRUE

library(nycflights13)
summary <- flights |>
  group_by(tailnum) |>
    summarize(avg_arr_delay = mean(arr_delay, na.rm=TRUE), num_flights = n())
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
Error in assign(cacheKey, frame, .rs.CachedDataEnv) : 
  attempt to use zero-length variable name
summary

ICMA 9/25/2025

billboard_long <- billboard |>
  pivot_longer(cols = wk1:wk76,
               names_to = "week",
               values_to = "rank")
billboard |>
  filter(artist == "2 Pac") |>
  select(wk10)

ICMA 09/30/2025

  • Simpson’s Paradox: trend in overall data differs from trends in individual groups
```{r}
Error: attempt to use zero-length variable name

ICMA 10/07/2025

mpg |>
  ggplot(aes(y = hwy, x = displ, shape=manufacturer)) +
  geom_point(color = "royalblue")

mpg |>
  ggplot(aes(y=hwy, x=displ)) +
  geom_point() + 
  geom_smooth()

mpg |>
  ggplot(aes(y=hwy, x=displ, color=drv)) + 
  geom_point() + 
  geom_smooth()


mpg |>
  ggplot(aes(y=hwy, x=displ)) + 
  geom_point(aes(color=drv)) + 
  geom_smooth()

mpg |>
  ggplot(aes(x = class, fill = class)) +
  geom_bar()

ICMA 10/14/2025

ggplot(mpg, aes(x=displ, y=hwy)) +
  geom_point(aes(color = class)) + 
  geom_smooth(se=FALSE) +
  labs(
    x = "Engine displacement (L)",
    y = "Highway fuel economy (mpg)",
    color = "Car type",
    title="Fuel efficiency generally decreases with engine size",
    subtitle="Two seaters (sports cars) are an exception because of their light weight",
    caption="Data from fueleconomy.gov"
  )

label_info <- mpg |>
  group_by(drv) |>
  arrange(desc(displ)) |>
  slice_head(n=1) |>
  mutate(
    drive_type = case_when(
      drv == "f" ~ "front=wheel drive",
      drv == "r" ~ "rear-wheel drive",
      drv == "4" ~ "4-wheel drive"
    )
  ) |>
  select(displ, hwy, drv, drive_type)

ggplot(mpg, aes(x=displ, y=hwy, color = drv)) +
  geom_point(alpha = 0.3) +
  geom_smooth(se = FALSE) +
  geom_text(
    data = label_info,
    aes(x = displ, y = hwy, label = drive_type),
    fontface = "bold", size = 5,
    hjust = "right", vjust="bottom"
  ) +
  theme(legend.position = "none")

ggplot(mpg, aes(x=displ, y=hwy, color)) +
  geom_point() +
  annotate(
    geom = "label", x = 3.5, y = 38,
    label = str_wrap("LArger engine sizes tend to have lower fuel economy", width = 30),
    hjust = "left", color = "red"
  ) + 
  annotate(
    geom = "segment",
    x = 3, y = 35
  )
Error in `annotate()`:
! Problem while setting up geom.
ℹ Error occurred in the 3rd layer.
Caused by error in `compute_geom_1()`:
! `geom_segment()` requires the following missing aesthetics: xend or yend.
Run `]8;;x-r-run:rlang::last_trace()rlang::last_trace()]8;;` to see where the error occurred.

ggplot(mpg, aes(X=displ, y=hwy)) +
  geom_point(aes(color=drv)) +
  geom_smooth() +
  cor_cardinates(xlim = 4, ylim=5)
Error in cor_cardinates(xlim = 4, ylim = 5) : 
  could not find function "cor_cardinates"

ICMA 10/21/2025

my_values <- c(1,3,5,NA,8,10)
mean(my_values)
[1] NA
mean(my_values, na.rm=TRUE)
[1] 5.4
is.na(my_values)
[1] FALSE FALSE FALSE  TRUE FALSE FALSE
flights |> filter(is.na(dep_time))
flights |>
  group_by(year, month, day) |>
  summarize(
    proportion_delayed = mean(dep_delay <= 60, na.rm=TRUE),
    count_long_delay = sum(arr_delay <= 300, na.rm=TRUE),
    .groups = "drop"
  )
x <- c(-3:3, NA)
if_else(x > 0, "+ve", "-ve", "???")
[1] "-ve" "-ve" "-ve" "-ve" "+ve" "+ve" "+ve" "???"
case_when(
  x == 0 ~ "0",
  x < 0 ~ "-ve",
  x > 0 ~ "+ve",
  .default = "???"
)
[1] "-ve" "-ve" "-ve" "0"   "+ve" "+ve" "+ve" "???"

ICMA 10/21/2025

ICMA 10/30/2025

  ({{ x }} - min({{ x }}, na.rm = TRUE)) / (max({{ x }}, na.rm=TRUE) = min({{ x }}, na.rm=TRUE))
Error: object 'x' not found
flights |> summarize(
    across(c(dep_delay, arr_delay, air_time),
           list(
             median = \(x) median(x, na.rm=TRUE),
             mean = \(x) mean(x, na.rm=TRUE),
           )),
    n=n()
  )
Error in `summarize()`:
ℹ In argument: `across(...)`.
Caused by error in `list()`:
! argument 3 is empty
Run `]8;;x-r-run:rlang::last_trace()rlang::last_trace()]8;;` to see where the error occurred.

ICMA 11/04/2025

flights$carrier
flights[[10]]
flights[["carrier"]]
flights["carrier"]
animals <- c("giraffe", "zebra", "monkey")

for (name in animals) {
  print(name)
}

for (i in seq_along(animals)) {
  print(animals[[i]])
}

ICMA 11/11/2025

LS0tDQp0aXRsZTogIkQyU0MgSUNNQXMiDQphdXRob3I6ICJBbmtpdCBNaXRoYmF2a2FyIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQoNClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiBXaGVuIHlvdSBleGVjdXRlIGNvZGUgd2l0aGluIHRoZSBub3RlYm9vaywgdGhlIHJlc3VsdHMgYXBwZWFyIGJlbmVhdGggdGhlIGNvZGUuIA0KDQpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouIA0KDQojIElDTUEgMDkvMDQvMjAyNQ0KDQpgYGB7cn0NCnBsb3QoY2FycykNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocGFsbWVycGVuZ3VpbnMpDQpsaWJyYXJ5KG55Y2ZsaWdodHMxMykNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBwZW5ndWlucywNCiAgICAgICBtYXBwaW5nID0gYWVzKHggPSBmbGlwcGVyX2xlbmd0aF9tbSwgeSA9IGJpbGxfbGVuZ3RoX21tKQ0KKSArDQpnZW9tX3BvaW50KCkNCmBgYA0KDQoNCmBgYHtyfQ0KdmlldyhwZW5ndWlucykNCmBgYA0KDQpgYGB7cn0NClBsYW50R3Jvd3RoDQpgYGANCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBQbGFudEdyb3d0aCwNCiAgICAgICBtYXBwaW5nID0gYWVzKHggPSBncm91cCwgeSA9IHdlaWdodCkNCikgKyANCmdlb21fcG9pbnQoKQ0KYGBgDQoNCmBgYHtyfQ0KZ2xpbXBzZShmbGlnaHRzKQ0KYGBgDQpgYGB7cn0NCmZsaWdodHMgfD4NCiAgZmlsdGVyKG1vbnRoID09IDEgJiBkYXkgPT0gMSkNCg0KZmxpZ2h0c19ob3VzdG9uIDwtIGZsaWdodHMgfD4NCiAgZmlsdGVyKGRlc3QgJWluJSBjKCJJQUgiLCAiSE9VIikpDQpgYGANCg0KYGBge3J9DQpmbGlnaHRzIHw+DQogIGFycmFuZ2UoeWVhciwgbW9udGgsIGRlc2MoZGF5KSwgZGVwX3RpbWUpDQpgYGANCmBgYHtyfQ0KZmxpZ2h0cyB8Pg0KICBkaXN0aW5jdChvcmlnaW4sIGRlc3QpDQpgYGANCmBgYHtyfQ0KZmxpZ2h0cyB8Pg0KICBmaWx0ZXIoYXJyX2RlbGF5ID4gMTIwICYgZGVwX2RlbGF5IDw9IDApIHw+DQogIGdncGxvdChhZXMoeCA9IGFycl9kZWxheSwgeSA9IGRlcF9kZWxheSkpICsNCiAgZ2VvbV9wb2ludCgpDQpgYGANCmBgYHtyfQ0KZmxpZ2h0cyB8Pg0KICBtdXRhdGUoc3BlZWQgPSBkaXN0YW5jZSAvIGFpcl90aW1lICogNjAsDQogICAgICAgICAuYWZ0ZXIgPSBkaXN0YW5jZSkgfD4NCiAgaGVhZCgpDQpgYGANCmBgYHtyfQ0KZmxpZ2h0cyB8Pg0KICByZW5hbWUoZGVwX2FpcnBvcnQgPSBvcmlnaW4sDQogICAgICAgICBhcnJfYWlycG9ydCA9IGRlc3QpDQogIHNlbGVjdCh5ZWFyLCBtb250aCwgZGF5LCBjb250YWlucygiZGVwIikpDQogIGhlYWQoKQ0KICANCmZsaWdodHMgfD4NCiAgc2VsZWN0KCF5ZWFyOmRheSkNCiAgaGVhZCgpDQpgYGANCmBgYHtyfQ0KZmxpZ2h0cyB8Pg0KICBncm91cF9ieShtb250aCkgfD4NCiAgY291bnQoKQ0KDQpmbGlnaHRzIHw+DQogIGdyb3VwX2J5KG1vbnRoKSB8Pg0KICBzdW1tYXJpemUoYXZnX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpKQ0KYGBgDQpgYGB7cn0NCmZsaWdodHMgfD4NCiAgZ3JvdXBfYnkobW9udGgpIHw+DQogIHN1bW1hcml6ZShhdmdfYXJyX2RlbGF5ID0gbWVhbihhcnJfZGVsYXksIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgc2RfYXJyX2RlbGF5ID0gc2QoYXJyX2RlbGF5LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgIG51bWJlcl9kZWxheWVkID0gc3VtKGFycl9kZWxheSA+IDAsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgdG90YWwgPSBuKCksDQogICAgICAgICAgcGVyY2VudGFnZSA9IG51bWJlcl9kZWxheWVkL3RvdGFsICogMTAwDQogICkgfD4NCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IG1vbnRoLA0KICAgICAgICAgICAgICAgICAgICAgICB5ID0gcGVyY2VudGFnZSkpDQpgYGANCg0KIyMgSUNNQSA5LzIzLzIwMjUNCg0KKiBWYXJpYWJsZXMgY2FuJ3Qgc3RhcnQgd2l0aCBhIG51bWJlciBvciBpbmNsdWRlIHNwYWNlcyBvciBzeW1ib2xzDQoqIFN0eWxlIHdlJ2xsIHVzZSBpcyBzbmFrZV9jYXNlDQoNCmBgYHtyfQ0KIyBiYWNrdGlja3MgbWFrZSB0aGlzIHdvcmsNCmAxbnVtYmVyYCA8LSAxMg0KcHJpbnQoYDFudW1iZXJgKQ0KYGBgDQpgYGB7ciBzdHlsZS1leGFtcGxlLCBlY2hvPVRSVUV9DQpsaWJyYXJ5KG55Y2ZsaWdodHMxMykNCnN1bW1hcnkgPC0gZmxpZ2h0cyB8Pg0KICBncm91cF9ieSh0YWlsbnVtKSB8Pg0KICAgIHN1bW1hcml6ZShhdmdfYXJyX2RlbGF5ID0gbWVhbihhcnJfZGVsYXksIG5hLnJtPVRSVUUpLCBudW1fZmxpZ2h0cyA9IG4oKSkNCnN1bW1hcnkNCmBgYA0KYGBge3J9DQojfCBsYWJlbDogc3R5bGUtZXhhbXBsZTINCiN8IGVjaG86IFRSVUUNCg0KbGlicmFyeShueWNmbGlnaHRzMTMpDQpzdW1tYXJ5IDwtIGZsaWdodHMgfD4NCiAgZ3JvdXBfYnkodGFpbG51bSkgfD4NCiAgICBzdW1tYXJpemUoYXZnX2Fycl9kZWxheSA9IG1lYW4oYXJyX2RlbGF5LCBuYS5ybT1UUlVFKSwgbnVtX2ZsaWdodHMgPSBuKCkpDQpzdW1tYXJ5DQpgYGANCg0KIyMgSUNNQSA5LzI1LzIwMjUNCmBgYHtyfQ0KYmlsbGJvYXJkX2xvbmcgPC0gYmlsbGJvYXJkIHw+DQogIHBpdm90X2xvbmdlcihjb2xzID0gd2sxOndrNzYsDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJ3ZWVrIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyYW5rIikNCmBgYA0KDQpgYGB7cn0NCmJpbGxib2FyZCB8Pg0KICBmaWx0ZXIoYXJ0aXN0ID09ICIyIFBhYyIpIHw+DQogIHNlbGVjdCh3azEwKQ0KYGBgDQojIyBJQ01BIDA5LzMwLzIwMjUNCg0KKiBTaW1wc29uJ3MgUGFyYWRveDogdHJlbmQgaW4gb3ZlcmFsbCBkYXRhIGRpZmZlcnMgZnJvbSB0cmVuZHMgaW4gaW5kaXZpZHVhbCBncm91cHMNCg0KYGBge3J9DQpmbGlnaHRzIHw+DQogIG11dGF0ZShnYWluID0gYXJyX2RlbGF5IC0gZGVwX2RlbGF5KSB8Pg0KICBmaWx0ZXIoIWlzLm5hKGdhaW4pKSB8Pg0KICBncm91cF9ieShjYXJyaWVyKSB8Pg0KICBzdW1tYXJpemUoDQogICAgYXZnX2dhaW4gPSBtZWFuKGdhaW4pLA0KICAgIHRvdGFsX2ZsaWdodHMgPSBuKCkNCiAgKSB8Pg0KICBhcnJhbmdlKGRlc2MoYXZnX2dhaW4pKSB8Pg0KICBzZWxlY3QoY2FycmllciwgYXZnX2dhaW4sIHRvdGFsX2ZsaWdodHMpDQpgYGANCmBgYHtyfQ0KZ2V0d2QoKQ0KY2xhc3NfZGF0YSA8LSByZWFkX2NzdigiV2VlazUtMV9DbGFzc0RhdGEuY3N2IiwgZ3Vlc3NfbWF4PTIpDQpjbGFzc19kYXRhDQpgYGANCmBgYHtyfQ0KcHJvYmxlbXMoY2xhc3NfZGF0YSkNCmBgYA0KDQpgYGB7cn0NCnJlYWRfY3N2KCJXZWVrNS0xX0NsYXNzRGF0YS5jc3YiLA0KICAgICAgICAgY29sX3R5cGVzID0gbGlzdChib251c1BheW1lbnQgPSBjb2xfbnVtYmVyKCkpLA0KICAgICAgICAgbmEgPSBjKCJOL0EiLCAiLiIpKSB8Pg0KICByZW5hbWUoYm9udXNfcGF5bWVudCA9IGJvbnVzUGF5bWVudCkNCmBgYA0KDQojIElDTUEgMTAvMDcvMjAyNQ0KDQoqIExheWVycw0KICAtIERhdGE6IHRoZSBkYXRhZnJhbWUgeW91J3JlIHBsb3R0aW5nIGZyb20NCiAgLSBBZXN0aGV0aWM6IHNwZWNpZmljIHRoaW5ncyBpbiB0aGUgZGF0YWZyYW1lIHRvIGJlIG1hcHBlZCB0byBhc3BlY3RzIG9mIHRoZSBkYXRhIHZpc3VhbGl6YXRpb246IHgtdmFsdWVzLCB5LXZhbHVlcywgc2l6ZS12YXJpYXRpb24sIGNvbG9yLWNhdGVnb3JpZXMsIGV0Yy4NCiAgLSBnZW9tOiBhIGdlb21ldHJ5IHJlcHJlc2VudGluZyBkYXRhIChsaW5lLCBwb2ludHMsZXRjLikNCiAgLSBzdGF0aXN0aWNzOiB0cmFuc2Zvcm1hdGlvbnMgdG8gYmUgcGxvdHRlZCAobWVhbnMsIG1lZGlhbnMsIGV0Yy4pDQogIC0gZmFjZXRzOiBzcGxpdHRpbmcgdGhlIGRhdGFzZXQgYmFzZWQgb24gc29tZSB2YXJpYWJsZSBvciBjYXRlZ29yeSBhbmQgcHJvdmlkaW5nIGEgc2VwYXJhdGUgcGxvdCBmb3IgZWFjaCBzcGxpdA0KICAtIGNvb3JkaW5hdGVzOiBudW1lcmljIHN5c3RlbSB0byBkZXRlcm1pbmUgcG9zaXRpb24gb2YgZ2VvbWV0cnkNCiAgLSB0aGVtZXM6IGRlZmF1bHQgdGhlbWVzIGZvciBheGVzLCBsaW5lcywgZ3JpZHMsIGV0Yy4NCg0KYGBge3J9DQptcGcgfD4NCiAgZ2dwbG90KGFlcyh5ID0gaHd5LCB4ID0gZGlzcGwsIGNvbG9yPW1hbnVmYWN0dXJlcikpICsNCiAgZ2VvbV9wb2ludChzaGFwZSA9IDE1LCBhbHBoYSA9IDAuNSkNCmBgYA0KYGBge3J9DQptcGcgfD4NCiAgZ2dwbG90KGFlcyh5ID0gaHd5LCB4ID0gZGlzcGwsIHNoYXBlPW1hbnVmYWN0dXJlcikpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJyb3lhbGJsdWUiKQ0KYGBgDQoNCmBgYHtyfQ0KbXBnIHw+DQogIGdncGxvdChhZXMoeT1od3ksIHg9ZGlzcGwpKSArDQogIGdlb21fcG9pbnQoKSArIA0KICBnZW9tX3Ntb290aCgpDQpgYGANCg0KYGBge3J9DQptcGcgfD4NCiAgZ2dwbG90KGFlcyh5PWh3eSwgeD1kaXNwbCwgY29sb3I9ZHJ2KSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fc21vb3RoKCkNCg0KbXBnIHw+DQogIGdncGxvdChhZXMoeT1od3ksIHg9ZGlzcGwpKSArIA0KICBnZW9tX3BvaW50KGFlcyhjb2xvcj1kcnYpKSArIA0KICBnZW9tX3Ntb290aCgpDQpgYGANCmBgYHtyfQ0KbXBnIHw+DQogIGdncGxvdChhZXMoeCA9IGNsYXNzLCBmaWxsID0gY2xhc3MpKSArDQogIGdlb21fYmFyKCkNCmBgYA0KDQojIyBJQ01BIDEwLzE0LzIwMjUNCg0KYGBge3J9DQpnZ3Bsb3QobXBnLCBhZXMoeD1kaXNwbCwgeT1od3kpKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY2xhc3MpKSArIA0KICBnZW9tX3Ntb290aChzZT1GQUxTRSkgKw0KICBsYWJzKA0KICAgIHggPSAiRW5naW5lIGRpc3BsYWNlbWVudCAoTCkiLA0KICAgIHkgPSAiSGlnaHdheSBmdWVsIGVjb25vbXkgKG1wZykiLA0KICAgIGNvbG9yID0gIkNhciB0eXBlIiwNCiAgICB0aXRsZT0iRnVlbCBlZmZpY2llbmN5IGdlbmVyYWxseSBkZWNyZWFzZXMgd2l0aCBlbmdpbmUgc2l6ZSIsDQogICAgc3VidGl0bGU9IlR3byBzZWF0ZXJzIChzcG9ydHMgY2FycykgYXJlIGFuIGV4Y2VwdGlvbiBiZWNhdXNlIG9mIHRoZWlyIGxpZ2h0IHdlaWdodCIsDQogICAgY2FwdGlvbj0iRGF0YSBmcm9tIGZ1ZWxlY29ub215LmdvdiINCiAgKQ0KDQpgYGANCmBgYHtyfQ0KZ2dwbG90KG1wZywgYWVzKHg9ZGlzcGwsIHk9aHd5KSkgKw0KICBnZW9tX3RleHQoYWVzKGNvbG9yID0gY2xhc3MsIGxhYmVsPSJDYXIiKSkNCmBgYA0KYGBge3J9DQpsaWJyYXIoZ2dyZXBlbCkNCg0KbGFiZWxfaW5mbyA8LSBtcGcgfD4NCiAgZ3JvdXBfYnkoZHJ2KSB8Pg0KICBhcnJhbmdlKGRlc2MoZGlzcGwpKSB8Pg0KICBzbGljZV9oZWFkKG49MSkgfD4NCiAgbXV0YXRlKA0KICAgIGRyaXZlX3R5cGUgPSBjYXNlX3doZW4oDQogICAgICBkcnYgPT0gImYiIH4gImZyb250PXdoZWVsIGRyaXZlIiwNCiAgICAgIGRydiA9PSAiciIgfiAicmVhci13aGVlbCBkcml2ZSIsDQogICAgICBkcnYgPT0gIjQiIH4gIjQtd2hlZWwgZHJpdmUiDQogICAgKQ0KICApIHw+DQogIHNlbGVjdChkaXNwbCwgaHd5LCBkcnYsIGRyaXZlX3R5cGUpDQoNCmdncGxvdChtcGcsIGFlcyh4PWRpc3BsLCB5PWh3eSwgY29sb3IgPSBkcnYpKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjMpICsNCiAgZ2VvbV9zbW9vdGgoc2UgPSBGQUxTRSkgKw0KICBnZW9tX3RleHQoDQogICAgZGF0YSA9IGxhYmVsX2luZm8sDQogICAgYWVzKHggPSBkaXNwbCwgeSA9IGh3eSwgbGFiZWwgPSBkcml2ZV90eXBlKSwNCiAgICBmb250ZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDUsDQogICAgaGp1c3QgPSAicmlnaHQiLCB2anVzdD0iYm90dG9tIg0KICApICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChtcGcsIGFlcyh4PWRpc3BsLCB5PWh3eSwgY29sb3IpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGFubm90YXRlKA0KICAgIGdlb20gPSAibGFiZWwiLCB4ID0gMy41LCB5ID0gMzgsDQogICAgbGFiZWwgPSBzdHJfd3JhcCgiTGFyZ2VyIGVuZ2luZSBzaXplcyB0ZW5kIHRvIGhhdmUgbG93ZXIgZnVlbCBlY29ub215Iiwgd2lkdGggPSAzMCksDQogICAgaGp1c3QgPSAibGVmdCIsIGNvbG9yID0gInJlZCINCiAgKSArIA0KICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInNlZ21lbnQiLA0KICAgIHggPSAzLCB5ID0gMzUNCiAgKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChtcGcsIGFlcyh4PWRpc3BsLCB5PWh3eSwgY29sb3I9ZHJ2KSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX3NlZ21lbnQoYWVzKHhlbmQ9IDQsIHllbmQgPSAyNSkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsNCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5yb3c9MykpDQpgYGANCmBgYHtyfQ0KZ2dwbG90KG1wZywgYWVzKFg9ZGlzcGwsIHk9aHd5KSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvcj1kcnYpKSArDQogIGdlb21fc21vb3RoKCkgKw0KICBjb3JfY2FyZGluYXRlcyh4bGltID0gNCwgeWxpbT01KQ0KYGBgDQoNCiMjIElDTUEgMTAvMjEvMjAyNQ0KDQpgYGB7cn0NCm15X3ZhbHVlcyA8LSBjKDEsMyw1LE5BLDgsMTApDQptZWFuKG15X3ZhbHVlcykNCmBgYA0KDQpgYGB7cn0NCm15X3ZhbHVlcyA8LSBjKDEsMyw1LE5BLDgsMTApDQptZWFuKG15X3ZhbHVlcywgbmEucm09VFJVRSkNCmBgYA0KYGBge3J9DQppcy5uYShteV92YWx1ZXMpDQpgYGANCmBgYHtyfQ0KZmxpZ2h0cyB8PiBmaWx0ZXIoaXMubmEoZGVwX3RpbWUpKQ0KYGBgDQoNCmBgYHtyfQ0KZmxpZ2h0cyB8PiBmaWx0ZXIobW9udGggPT0gMTEgfCBtb250aCA9PSAxMikNCmBgYA0KDQpgYGB7cn0NCmZsaWdodHMgfD4NCiAgZmlsdGVyKG1vbnRoICVpbiUgYygxMSwxMikpDQpgYGANCmBgYHtyfQ0KZmxpZ2h0cyB8Pg0KICBncm91cF9ieSh5ZWFyLCBtb250aCwgZGF5KSB8Pg0KICBzdW1tYXJpemUoDQogICAgYWxsX2RlbGF5ZWQgPSBhbGwoZGVwX2RlbGF5IDw9IDYwLCBuYS5ybSA9IFRSVUUpLA0KICAgIGFueV9sb25nX2RlbGF5ID0gYW55KGFycl9kZWxheSA+PSAzMDAsIG5hLnJtID0gVFJVRSksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApDQpgYGANCg0KYGBge3J9DQpmbGlnaHRzIHw+DQogIGdyb3VwX2J5KHllYXIsIG1vbnRoLCBkYXkpIHw+DQogIHN1bW1hcml6ZSgNCiAgICBwcm9wb3J0aW9uX2RlbGF5ZWQgPSBtZWFuKGRlcF9kZWxheSA8PSA2MCwgbmEucm09VFJVRSksICMgbWVhbigpIGlzIHN1bSgpIC8gbGVuZ3RoKCkNCiAgICBjb3VudF9sb25nX2RlbGF5ID0gc3VtKGFycl9kZWxheSA8PSAzMDAsIG5hLnJtPVRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KeCA8LSBjKC0zOjMsIE5BKQ0KaWZfZWxzZSh4ID4gMCwgIit2ZSIsICItdmUiLCAiPz8/IikNCmBgYA0KYGBge3J9DQpjYXNlX3doZW4oDQogIHggPT0gMCB+ICIwIiwNCiAgeCA8IDAgfiAiLXZlIiwNCiAgeCA+IDAgfiAiK3ZlIiwNCiAgLmRlZmF1bHQgPSAiPz8/Ig0KKQ0KYGBgDQpgYGB7cn0NCmZsaWdodHMgfD4NCiAgZ3JvdXBfYnkoZGVzdCkgfD4NCiAgc3VtbWFyaXplKA0KICAgIG4gPSBuKCksDQogICkgfD4NCiAgaGVhZCgpDQpgYGANCmBgYHtyfQ0KZmxpZ2h0cyB8Pg0KICBncm91cF9ieShkZXN0KSB8Pg0KICBzdW1tYXJpemUoY2FycmllcnMgPSBuX2Rpc3RpbmN0KGNhcnJpZXIpKSB8Pg0KICBhcnJhbmdlKGRlc2MoY2FycmllcnMpKQ0KYGBgDQoNCg0KIyMgSUNNQSAxMC8yMS8yMDI1DQoNCmBgYHtyfQ0KDQpgYGANCg0KIyMgSUNNQSAxMC8zMC8yMDI1DQoNCmBgYHtyfQ0KYWlybGluZXMgfD4NCiAgaGVhZCgpDQpgYGANCmBgYHtyfQ0KZmxpZ2h0cyB8Pg0KICBzZWxlY3QoeWVhciwgdGltZV9ob3VyLCBvcmlnaW4sZGVzdCwgdGFpbG51bSwgY2FycmllcikgfD4NCiAgbGVmdF9qb2luKHBsYW5lcywgam9pbl9ieSh0YWlsbnVtKSkNCmBgYA0KDQpgYGB7cn0NCnJlc2NhbGUwMSA8LSBmdW5jdGlvbih4KSB7DQogICh7eyB4IH19IC0gbWluKHt7IHggfX0sIG5hLnJtID0gVFJVRSkpIC8gKG1heCh7eyB4IH19LCBuYS5ybT1UUlVFKSA9IG1pbih7eyB4IH19LCBuYS5ybT1UUlVFKSkNCn0NCmBgYA0KYGBge3J9DQpmbGlnaHRzIHw+IHN1bW1hcml6ZSgNCiAgICBhY3Jvc3MoYyhkZXBfZGVsYXksIGFycl9kZWxheSwgYWlyX3RpbWUpLA0KICAgICAgICAgICBmdW5jdGlvbih4KSBtZWRpYW4oeCwgbmEucm09VFJVRSkpLA0KICAgIG49bigpDQogICkNCg0KZmxpZ2h0cyB8PiBzdW1tYXJpemUoDQogICAgYWNyb3NzKGMoZGVwX2RlbGF5LCBhcnJfZGVsYXksIGFpcl90aW1lKSwNCiAgICAgICAgICAgXCh4KSBtZWRpYW4oeCwgbmEucm09VFJVRSkpLA0KICAgIG49bigpDQogICkNCmBgYA0KYGBge3J9DQpmbGlnaHRzIHw+IHN1bW1hcml6ZSgNCiAgICBhY3Jvc3MoYyhkZXBfZGVsYXksIGFycl9kZWxheSwgYWlyX3RpbWUpLA0KICAgICAgICAgICBsaXN0KA0KICAgICAgICAgICAgIG1lZGlhbiA9IFwoeCkgbWVkaWFuKHgsIG5hLnJtPVRSVUUpLA0KICAgICAgICAgICAgIG1lYW4gPSBcKHgpIG1lYW4oeCwgbmEucm09VFJVRSksDQogICAgICAgICAgICkpLA0KICAgIG49bigpDQogICkNCmBgYA0KDQoNCiMjIElDTUEgMTEvMDQvMjAyNQ0KDQpgYGB7cn0NCmZsaWdodHMkY2Fycmllcg0KYGBgDQoNCg0KYGBge3J9DQpmbGlnaHRzW1sxMF1dDQpgYGANCg0KYGBge3J9DQpmbGlnaHRzW1siY2FycmllciJdXQ0KYGBgDQoNCmBgYHtyfQ0KZmxpZ2h0c1siY2FycmllciJdDQpgYGANCg0KYGBge3J9DQphbmltYWxzIDwtIGMoImdpcmFmZmUiLCAiemVicmEiLCAibW9ua2V5IikNCg0KZm9yIChuYW1lIGluIGFuaW1hbHMpIHsNCiAgcHJpbnQobmFtZSkNCn0NCg0KZm9yIChpIGluIHNlcV9hbG9uZyhhbmltYWxzKSkgew0KICBwcmludChhbmltYWxzW1tpXV0pDQp9DQpgYGANCg0KDQojIyBJQ01BIDExLzExLzIwMjUNCg0K